﻿#ifndef __SS_UNIQUE_ARRAY_H__
#define __SS_UNIQUE_ARRAY_H__
#include "ssArray.h"

namespace StarSeeker
{

template<typename T>
class ssUniqueArray
{
public:
	ssUniqueArray()
	{
	}
	ssUniqueArray(const ssUniqueArray& ua)
		:m_arr(ua.m_arr)
	{
	}
	virtual ~ssUniqueArray()
	{
	}
	void operator = (const ssUniqueArray& ua)
	{
		m_arr = ua.m_arr;
	}

	bool PushBack(const T& t)
	{
		for (ulint i=0; i<m_arr.Count(); ++i)
		{
			if (m_arr[i]==t)
			{
				return false;
			}
		}
		return m_arr.PushBack(t);
	}
	bool PushBackCP(const T t)
	{
		return PushBack(t);
	}
	T * Back()
	{
		return m_arr.Back();
	}
	T * PopBack()
	{
		return m_arr.PopBack();
	}
	//按下标获取元素，越界则返回0
	T * At(ulint offset)
	{
		return m_arr.At(offset);
	}
	//按下标获取元素
	T & operator [] (ulint offset) const
	{
		return m_arr[offset];
	}
	//清空数组
	void Empty()
	{
		m_arr.Empty();
	}
	//数组是否满
	bool IsFull() const
	{
		return m_arr.IsFull();
	}
	//数量
	ulint Count() const
	{
		return m_arr.Count();
	}
	lint Length() const
	{
		return m_arr.Length();
	}
	//删除一个元素
	void Remove(ulint offset)
	{
		m_arr.Remove(offset);
	}
	//元素已存在
	bool ElementExists(const T& t) const
	{
		for (ulint i = 0; i < m_arr.Count(); ++i)
		{
			if (m_arr[i] == t)
			{
				return true;
			}
		}
		return false;
	}

protected:
	ssArray<T,0>			m_arr;
};

}
#endif
